#ifndef __TFTP_H__
#define __TFTP_H__

#include <stdint.h>

typedef enum 
{
    tftp_cmd_rrq     = 0x01, /**<  读文件请求包 */
    tftp_cmd_wrq     = 0x02, /**<  写文件请求包 */
    tftp_cmd_data    = 0x03, /**<  数据传输请求包(包括读数据或写数据) */
    tftp_cmd_ack     = 0x04, /**<  数据传输确认包 */
    tftp_cmd_err     = 0x05, /**<  出错数据包 */
    tftp_cmd_req_ack = 0x06, /**<  rrq/wrq的回应包 */
}tftp_cmd_e;

typedef enum
{
    tftp_err_undefined            =  0x00, /**<  未定义的错误,详见随后的错误信息 */
    tftp_err_not_found            =  0x01, /**<  文件未找到 */
    tftp_err_access_violation     =  0x02, /**<  非法访问 */
    tftp_err_disk_full            =  0x03, /**<  存储空间满 */
    tftp_err_illegal_operation    =  0x04, /**<  非法的tftp操作 */
    tftp_err_unknown_transfer_id  =  0x05, /**<  未知的传输id */
    tftp_err_file_exist           =  0x06, /**<  文件已经存在 */
    tftp_err_no_such_user         =  0x07, /**<  没有这个用户 */
}tftp_errcode_e;

#define TFTP_PAYLOAD_MAX (512)

typedef struct
{
    uint16_t opcode;       /**<  操作码 */
    char  filemsg[TFTP_PAYLOAD_MAX]; /**<  文件名及模式 */
}tftp_request_packet_s;

typedef struct
{
    uint16_t opcode;       /**<  操作码 */
    uint16_t block;     /**<  块编号 */
    uint8_t  payload[TFTP_PAYLOAD_MAX]; /**<  数据内容 */
}tftp_data_packet_s;

typedef struct
{
    uint16_t opcode;   /**<  操作码 */
    uint16_t block; /**<  块编号 */
}tftp_ack_packet_s;

typedef struct
{
    uint16_t opcode;   /**<  操作码 */
    uint16_t errcode; /**<  差错码 */
    char message[TFTP_PAYLOAD_MAX]; /**<  差错信息 */
}tftp_error_packet_s;

typedef struct
{
    uint16_t opcode;
    char message[TFTP_PAYLOAD_MAX];
}tftp_req_ack_s;

#endif